#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QAction>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QInputDialog>
#include <QFileDialog>
#include <QPainter>
#include <QIcon>
#include <QTextStream>
#include <QTimer>
#include <QMessageBox>
#include <QTextEdit>
#include "ai.h"

static const int WIDTH=600;//图像宽度
static const int HEIGHT=450;//图像高度
static const int XX=40;//起始点横坐标
static const int YY=90;//起始点纵坐标
static const int MINIMUN_ROW=3;//最小行数
static const int MINIMUN_LINE=3;//最小列数
static const int MAXIMUN_ROW=15;//最大行数
static const int MAXIMUN_LINE=20;//最大列数

struct RowLine//行列值
{
    int row;//行值
    int line;//列值
};
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
private:
    //UI
    //菜单栏
    QMenu *menu_file;//文本菜单
    QMenu *menu_edit;//编辑菜单
    QMenu *menu_show;//展示菜单
    QMenu *menu_other;//其他菜单
    //工具栏
    QToolBar *toolbar_file;
    QToolBar *toolbar_edit;
    QToolBar *toolbar_fun;
    //actions
    QAction *action_open;//打开文件
    QAction *action_save;//存储文件
    QAction *action_grid;//重绘网格
    QAction *action_person;//编辑人员
    QAction *action_barrier;//编辑障碍
    QAction *action_exit;//编辑出口
    QAction *action_start;//开始演示
    QAction *action_pause;//暂停演示
    //信息展示文本框
    QTextEdit *textedit_info_show;

    //matrix
    int** matrix;//信息矩阵，用于记录每个点(方格)上的情况：0 空白 1 人 2 障碍 3 出口
    int row=6;//行数，默认为6
    int line=8;//列数，默认为8
    int size_row;//行间距
    int size_line;//列间距
    //postion & translation
    RowLine XYtoRL(const int x, const int y);//像素坐标到逻辑行列值得转换
    //free
    void free_get();//获取内存
    void free_delete();//释放内存
    void initalization();//矩阵及其他信息初始化
    bool initalization(QFile *file);//加载文件信息
    //timer
    QTimer *timer;//定时器
    int step_times;//定时器触发次数，用于展示结果

    //draw
    void drawModel(QPainter &painter, int row, int line);//图表的绘制
    void draw_sign(QPainter &painter);//各点(方格)图像的绘制
    void paintEvent(QPaintEvent *);//绘图事件
    //mouse
    void mouseReleaseEvent(QMouseEvent *);//鼠标点击释放事件
    //judge
    bool canShow();//判断是否能开始演示，需要至少各存在一个人员和出口
    //AI
    AI *ai;//智能机，计算每次的最优路径
private slots:
    void slot_open();//打开文件槽函数
    void slot_save();//存储文件槽函数
    void slot_grid();//绘制网格槽函数
    void slot_person();//人员编辑槽函数
    void slot_barrier();//障碍编辑槽函数
    void slot_exit();//出口编辑槽函数
    void slot_start();//开始演示槽函数
    void slot_pause();//暂停演示槽函数
    void time();//定时器触发的函数，用于控制演示动画
};

#endif // MAINWINDOW_H
